package handler

import (
	"errors"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"myai/core"
	"myai/store/model"
	"myai/store/vo"
	"myai/utils"
	"myai/utils/resp"
	"strings"
)

// InviteHandler 用户邀请
type InviteHandler struct {
	BaseHandler
}

func NewInviteHandler(app *core.AppServer, db *gorm.DB) *InviteHandler {
	return &InviteHandler{
		BaseHandler{App: app, DB: db},
	}
}

// Code godoc
// @Summary      获取当前用户邀请码
// @Description  获取当前用户邀请码
// @Tags         前台-邀请码
// @Accept       json
// @Produce      json
// @Success      200  {object}  types.BizVo{data=vo.InviteCode}
// @Router       /api/invite/code [get]
// @Security ApiKeyAuth
func (h *InviteHandler) Code(c *gin.Context) {
	userId := h.GetLoginUserId(c)
	var inviteCode model.InviteCode
	res := h.DB.Where("user_id = ?", userId).First(&inviteCode)
	// 如果邀请码不存在，就创建
	if res.Error != nil {
		// 生成邀请码
		code := strings.ToUpper(utils.RandString(8))
		for {
			res = h.DB.Where("code = ?", code).First(&inviteCode)
			if errors.Is(res.Error, gorm.ErrRecordNotFound) {
				break
			} else {
				code = strings.ToUpper(utils.RandString(8))
			}
		}
		inviteCode.UserId = userId
		inviteCode.Code = code
		h.DB.Create(&inviteCode)
	}
	var codeVo vo.InviteCode
	err := utils.CopyObject(inviteCode, &codeVo)
	if err != nil {
		resp.ERROR(c, "拷贝对象失败："+err.Error())
		return
	}
	resp.SUCCESS(c, codeVo)
}

// List godoc
// @Summary      Log 查询邀请记录
// @Description  Log 查询邀请记录
// @Tags         前台-邀请码
// @Accept       json
// @Produce      json
// @Param        page   query    int  true  "页码"
// @Param        page_size   query    int  true  "每页数量"
// @Success      200  {object}  types.BizVo{data=vo.Page}
// @Router       /api/invite/list [get]
// @Security ApiKeyAuth
func (h *InviteHandler) List(c *gin.Context) {
	page := h.GetInt(c, "page", 1)
	pageSize := h.GetInt(c, "page_size", 10)
	userId := h.GetLoginUserId(c)
	session := h.DB.Session(&gorm.Session{}).Where("inviter_id = ?", userId)
	var total int64
	// 查询邀请记录总数
	session.Model(&model.InviteLog{}).Count(&total)
	var items []model.InviteLog
	var list = make([]vo.InviteLog, 0)
	offset := (page - 1) * pageSize
	res := session.Order("id DESC").Offset(offset).Limit(pageSize).Find(&items)
	if res.Error == nil {
		for _, item := range items {
			var inviteLogVo vo.InviteLog
			err := utils.CopyObject(item, &inviteLogVo)
			if err == nil {
				inviteLogVo.Id = item.Id
				inviteLogVo.CreatedAt = item.CreatedAt.Unix()
				list = append(list, inviteLogVo)
			} else {
				log.Errorf("拷贝数据出现错误：%v", err.Error())
			}
		}
	}
	resp.SUCCESS(c, vo.NewPage(total, page, pageSize, list))
}

// Hits godoc
// @Summary      邀请码点击次数
// @Description  邀请码点击次数
// @Tags         前台-邀请码
// @Accept       json
// @Produce      json
// @Param        code   query    string  true  "邀请码"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/invite/hits [get]
func (h *InviteHandler) Hits(c *gin.Context) {
	code := h.GetTrim(c, "code")
	h.DB.Model(&model.InviteCode{}).Where("code = ?", code).UpdateColumn("hits", gorm.Expr("hits + ?", 1))
	resp.SUCCESS(c)
}
